---
id: index
sidebar_position: 1
---
# 分布式架构理论
大型的互联网系统的演进过程，不同的阶段系统所采用的系统架构是怎么样的，以及在不同的阶段系统会遇到什么问题和挑战，以及这些问题在当时采用了什么样的解决方案
* 单体应用架构，单体应用架构如何解决性能和容量的问题，当单体应用架构发展到一定阶段，就需要分布式架构
## 互联网系统架构演进
如何从一个单体应用演进成一个大型的分布式系统（全貌）。
### 中国互联网发展历程
* 1994 - 2000 年：从四大门户到搜索
* 2001 - 2009 年: 从搜索到社交化网络
* 2010 - 至今：移动互联网和自媒体
### 单体架构
#### 单机服务
![](./img/单体架构.png#pic_center)
* 单机服务，用一台服务器就可以满足
#### 单体架构——各司其职
![](./img/单体架构2.png#pic_center)
#### 引入缓存缓解数据库压力
![](./img/开始引入缓存.png#pic_center)
* 引入缓存释放给数据库压力
* 内存访问速度远远大于缓存
### 集群架构
tomcat7 之前，一个请求就需要占用一个线程，所以单个服务器很难突破 1000 的并发，<br/>
在 tomcat8 之后，改为了 NIO 的方式，单个服务器就能达到差不多 4000 左右的并发，即使这样系统的并发量达到应用服务器能够承载的能力时。<br/>
系统会出现响应延迟，拒绝服务等状况。会成为整个网站的性能瓶颈。<br/>

一台服务器处理有瓶颈，这时候就多部署几台提升并发量，把它变成一个应用集群。
![](./img/集群.png#pic_center)

当单体应用变成应用集群之后，就需要引入负载均衡调度服务器，将请求按照某种策略转发到具体的应用实例上。
![](./img/集群负载均衡.png#pic_center)
* 所有的请求直接打到负载均衡组件
* 单台服务器 > 多台服务器

### 数据读写分离分散压力提升性能
![](./img/引入读写分离.png#pic_center)
* 并非所有的请求都操作缓存，且存在缓存失效场景，对数据库的访问造成压力
* 利用数据库主从复制机制，将读和写操作分开，进一步提升性能
#### 数据访问模块的作用
* 对接多个数据源、处理读写分离、甚至分库分表等
* 独立与应用程序存在的
* Apache Sharding Sphere
### 引入CDN为前端资源加速
![](./img/引入CDN为前端资源提速.png#pic_center)
* CDN 是 一个内容分发网络，作用是让用户就近获取所需资源
* 把静态资源提前缓存到各地的边缘服务器
* 可以有效降低DDos攻击
### 全面分布化
* 随着规模不断发展，产生的数据越来越多
* 单文件服务器、单数据库服务器也渐渐地达到瓶颈
* 利用集群化横向扩展解决问题

![](./img/利用集群化横向扩展解决问题.png#pic_center)
### 海量数据存储和数据异构问题
:::tip
不同构件之间的属性差别很大，在关系型数据库里面放到同一张表里面存储的话，就需要定义很多的字段，这些字段不是所有的数据都是需要的，慢慢的这张表就会出现大量的字段没有值的情况。<br/>
对于 差异很大的数据存储在 jsonString 里。
:::
开始引入 NoSQL & 搜索引擎
![](./img/引入搜索引擎.png#pic_center)

## 单体应用面临的问题和挑战
* 单体应用的代码膨胀，研发成本变高，难实现敏捷交付（系统已经很庞大，错综复杂的代码要求开发人员要考虑的点非常多，时刻需要考虑新增的代码是否影响原有功能）。
* 代码维护成本变高，开发人员交接困难
* 测试成本变高，回归的工作量变大，给测试带来巨大的工作量（单体的所有代码逻辑耦合在一起，牵一发动全身）
* 可扩展性差，技术升级时需考虑整体，无法单独调整
:::tip 解决方案
大而全的单体拆分为多个独立的应用。
:::
## 应用拆分和解耦
* 高内聚、低耦合
![](./img/应用拆分和解耦.png#pic_center)
* 对应用模块进行拆分之后，通过消息中间件进行交互
* 此外还有异步处理、应用解耦、流量削峰等作用

## 模块拆分引发的问题
* 代码冗余，多处相同的代码，维护起来困难
* 复杂度扩散
* 多个应用共用同一套数据库资源，这样某一个应用把数据库资源都耗尽，其它的应用都会挂掉
## 开始引入服务化架构
![](./img/SOA和微服务.png#pic_center)
## 运行态和运营态
* 系统监控与分析（接口的成功率、接口的性能等等，保证服务安全的运行）
* 日志收集与分析
* 数据挖掘与分析
## 架构设计思想（重点）。

## CAP
整个分布式理论的基石，分布式系统中，一致性，可用性、分区容错性最多同时满足两个

分布式数据存储不可能同时满足以下三个要求
* 一致性（Partition tolerance）每次读取得到的信息是一致的，从分布式的存储系统中不同节点读取的数据都是一致的
* 可用性（Availability）每个请求都会收到正常的响应，不管成功还是失败
* 分区容错性（Consistency）即使系统发生分区仍然可以正常运行，分布式系统中多个节点之间网络互通构成分区，这个系统仍然能够正常运行

不仅仅指数据存储系统，所有的分布式系统都需要在 CAP 这三点之间进行权衡。

![](./img/CAP理论的理解.png#pic_center)


## BASE 理论